{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "copyright"
   },
   "outputs": [],
   "source": [
    "# Copyright 2021 Google LLC\n",
    "#\n",
    "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "#     https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "title:migration,new"
   },
   "source": [
    "# AutoML SDK: AutoML image classification model\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "install_aip"
   },
   "source": [
    "## Installation\n",
    "\n",
    "Install the latest (preview) version of AutoML SDK.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "eGO6_2SExXiI",
    "outputId": "a966db70-192a-4bb7-f79c-9c9742c09846"
   },
   "outputs": [],
   "source": [
    "! pip3 install -U google-cloud-automl --user\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "install_storage"
   },
   "source": [
    "Install the Google *cloud-storage* library as well.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "G0bLTzVWxXiJ",
    "outputId": "ac5e6d08-d3e4-4076-ac27-6c234b4fc678"
   },
   "outputs": [],
   "source": [
    "! pip3 install google-cloud-storage\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "restart"
   },
   "source": [
    "### Restart the Kernel\n",
    "\n",
    "Once you've installed the AutoML SDK and Google *cloud-storage*, you need to restart the notebook kernel so it can find the packages.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "33Uq-fKkxXiK"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "\n",
    "if not os.getenv(\"AUTORUN\"):\n",
    "    # Automatically restart kernel after installs\n",
    "    import IPython\n",
    "    app = IPython.Application.instance()\n",
    "    app.kernel.do_shutdown(True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "before_you_begin"
   },
   "source": [
    "## Before you begin\n",
    "\n",
    "### GPU run-time\n",
    "\n",
    "*Make sure you're running this notebook in a GPU runtime if you have that option. In Colab, select* **Runtime > Change Runtime Type > GPU**\n",
    "\n",
    "### Set up your GCP project\n",
    "\n",
    "**The following steps are required, regardless of your notebook environment.**\n",
    "\n",
    "1. [Select or create a GCP project](https://console.cloud.google.com/cloud-resource-manager). When you first create an account, you get a $300 free credit towards your compute/storage costs.\n",
    "\n",
    "2. [Make sure that billing is enabled for your project.](https://cloud.google.com/billing/docs/how-to/modify-project)\n",
    "\n",
    "3. [Enable the AutoML APIs and Compute Engine APIs.](https://console.cloud.google.com/flows/enableapi?apiid=ml.googleapis.com,compute_component)\n",
    "\n",
    "4. [Google Cloud SDK](https://cloud.google.com/sdk) is already installed in AutoML Notebooks.\n",
    "\n",
    "5. Enter your project ID in the cell below. Then run the  cell to make sure the\n",
    "Cloud SDK uses the right project for all the commands in this notebook.\n",
    "\n",
    "**Note**: Jupyter runs lines prefixed with `!` as shell commands, and it interpolates Python variables prefixed with `$` into these commands.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "set_project_id"
   },
   "outputs": [],
   "source": [
    "PROJECT_ID = \"[your-project-id]\" #@param {type:\"string\"}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "autoset_project_id",
    "outputId": "2663b1ca-f6c6-43ed-c23b-654919cb200c"
   },
   "outputs": [],
   "source": [
    "if PROJECT_ID == \"\" or PROJECT_ID is None or PROJECT_ID == \"[your-project-id]\":\n",
    "    # Get your GCP project id from gcloud\n",
    "    shell_output = !gcloud config list --format 'value(core.project)' 2>/dev/null\n",
    "    PROJECT_ID = shell_output[0]\n",
    "    print(\"Project ID:\", PROJECT_ID)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "set_gcloud_project_id",
    "outputId": "c401449c-69bb-499a-adc2-ddc15b6cf7f4"
   },
   "outputs": [],
   "source": [
    "! gcloud config set project $PROJECT_ID\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "region"
   },
   "source": [
    "#### Region\n",
    "\n",
    "You can also change the `REGION` variable, which is used for operations\n",
    "throughout the rest of this notebook.  Below are regions supported for AutoML. We recommend when possible, to choose the region closest to you.\n",
    "\n",
    "- Americas: `us-central1`\n",
    "- Europe: `europe-west4`\n",
    "- Asia Pacific: `asia-east1`\n",
    "\n",
    "You cannot use a Multi-Regional Storage bucket for training with AutoML. Not all regions provide support for all AutoML services. For the latest support per region, see [Region support for AutoML services]()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "_eH8WcWTxXiM"
   },
   "outputs": [],
   "source": [
    "REGION = 'us-central1' #@param {type: \"string\"}\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "timestamp"
   },
   "source": [
    "#### Timestamp\n",
    "\n",
    "If you are in a live tutorial session, you might be using a shared test account or project. To avoid name collisions between users on resources created, you create a timestamp for each instance session, and append onto the name of resources which will be created in this tutorial.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NoqPBceExXiM"
   },
   "outputs": [],
   "source": [
    "from datetime import datetime\n",
    "\n",
    "\n",
    "TIMESTAMP = datetime.now().strftime(\"%Y%m%d%H%M%S\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gcp_authenticate"
   },
   "source": [
    "### Authenticate your GCP account\n",
    "\n",
    "**If you are using AutoML Notebooks**, your environment is already\n",
    "authenticated. Skip this step.\n",
    "\n",
    "*Note: If you are on an AutoML notebook and run the cell, the cell knows to skip executing the authentication steps.*\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "6aUuFIftxXiN"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "\n",
    "# If you are running this notebook in Colab, run this cell and follow the\n",
    "# instructions to authenticate your Google Cloud account. This provides access\n",
    "# to your Cloud Storage bucket and lets you submit training jobs and prediction\n",
    "# requests.\n",
    "\n",
    "# If on AutoML, then don't execute this code\n",
    "if not os.path.exists('/opt/deeplearning/metadata/env_version'):\n",
    "    if 'google.colab' in sys.modules:\n",
    "        from google.colab import auth as google_auth\n",
    "        google_auth.authenticate_user()\n",
    "\n",
    "    # If you are running this tutorial in a notebook locally, replace the string\n",
    "    # below with the path to your service account key and run this cell to\n",
    "    # authenticate your Google Cloud account.\n",
    "    else:\n",
    "        %env GOOGLE_APPLICATION_CREDENTIALS your_path_to_credentials.json\n",
    "\n",
    "    # Log in to your account on Google Cloud\n",
    "    ! gcloud auth login\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bucket:batch_prediction"
   },
   "source": [
    "### Create a Cloud Storage bucket\n",
    "\n",
    "**The following steps are required, regardless of your notebook environment.**\n",
    "\n",
    "This tutorial is designed to use training data that is in a public Cloud Storage bucket and a local Cloud Storage bucket for your batch predictions. You may alternatively use your own training data that you have stored in a local Cloud Storage bucket.\n",
    "\n",
    "Set the name of your Cloud Storage bucket below. It must be unique across all Cloud Storage buckets.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "bucket"
   },
   "outputs": [],
   "source": [
    "BUCKET_NAME = \"[your-bucket-name]\" #@param {type:\"string\"}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "autoset_bucket"
   },
   "outputs": [],
   "source": [
    "if BUCKET_NAME == \"\" or BUCKET_NAME is None or BUCKET_NAME == \"[your-bucket-name]\":\n",
    "    BUCKET_NAME = PROJECT_ID + \"aip-\" + TIMESTAMP\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "create_bucket"
   },
   "source": [
    "**Only if your bucket doesn't already exist**: Run the following cell to create your Cloud Storage bucket.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "-8qURIGmxXiO",
    "outputId": "e887810d-a0fd-4063-d636-20313733b955"
   },
   "outputs": [],
   "source": [
    "! gsutil mb -l $REGION gs://$BUCKET_NAME\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "validate_bucket"
   },
   "source": [
    "Finally, validate access to your Cloud Storage bucket by examining its contents:\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "t_65JAARxXiP"
   },
   "outputs": [],
   "source": [
    "! gsutil ls -al gs://$BUCKET_NAME\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "setup_vars"
   },
   "source": [
    "### Set up variables\n",
    "\n",
    "Next, set up some variables used throughout the tutorial.\n",
    "### Import libraries and define constants\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "import_aip"
   },
   "source": [
    "#### Import AutoML SDK\n",
    "\n",
    "Import the AutoML SDK into our Python environment.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "P8L1tKAexXiQ"
   },
   "outputs": [],
   "source": [
    "import json\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "\n",
    "\n",
    "from google.cloud import automl\n",
    "\n",
    "\n",
    "from google.protobuf.json_format import MessageToJson\n",
    "from google.protobuf.json_format import ParseDict\n",
    "from googleapiclient.discovery import build\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "aip_constants"
   },
   "source": [
    "#### AutoML constants\n",
    "\n",
    "Setup up the following constants for AutoML:\n",
    "\n",
    "- `PARENT`: The AutoML location root path for dataset, model and endpoint resources.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "rG1L9BEzxXiR"
   },
   "outputs": [],
   "source": [
    "# AutoML location root path for your dataset, model and endpoint resources\n",
    "PARENT = \"projects/\" + PROJECT_ID + \"/locations/\" + REGION\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "clients"
   },
   "source": [
    "## Clients\n",
    "\n",
    "The AutoML SDK works as a client/server model. On your side (the Python script) you will create a client that sends requests and receives responses from the server (AutoML).\n",
    "\n",
    "You will use several clients in this tutorial, so set them all up upfront.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "c3sR3OxmxXiR",
    "outputId": "5bc213e7-2df8-4aca-dbf8-f8d267e98d52"
   },
   "outputs": [],
   "source": [
    "def automl_client():\n",
    "    return automl.AutoMlClient()\n",
    "\n",
    "\n",
    "def prediction_client():\n",
    "    return automl.PredictionServiceClient()\n",
    "\n",
    "\n",
    "def operations_client():\n",
    "    return automl.AutoMlClient()._transport.operations_client\n",
    "\n",
    "\n",
    "clients = {}\n",
    "clients[\"automl\"] = automl_client()\n",
    "clients[\"prediction\"] = prediction_client()\n",
    "clients[\"operations\"] = operations_client()\n",
    "\n",
    "for client in clients.items():\n",
    "    print(client)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "import_file:flowers,csv,icn"
   },
   "outputs": [],
   "source": [
    "IMPORT_FILE =  \"gs://cloud-ml-data/img/flower_photos/train_set.csv\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "2do-AnOHxXiS",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#%%capture\n",
    "! gsutil cp -r gs://cloud-ml-data/img/flower_photos/ gs://$BUCKET_NAME\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "hwMjQtLLxXiS"
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "all_files_csv = ! gsutil cat $IMPORT_FILE\n",
    "all_files_csv = [ l.replace(\"cloud-ml-data/img\", BUCKET_NAME) for l in all_files_csv ]\n",
    "\n",
    "IMPORT_FILE = \"gs://\" + BUCKET_NAME   + \"/flower_photos/train_set.csv\"\n",
    "with tf.io.gfile.GFile(IMPORT_FILE, 'w') as f:\n",
    "    for l in all_files_csv:\n",
    "        f.write(l + \"\\n\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "! gsutil cat $IMPORT_FILE | head -n 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "datasets_create:migration,new,request"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/dandelion/284497199_93a01f48f6.jpg,dandelion\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/dandelion/3554992110_81d8c9b0bd_m.jpg,dandelion\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/daisy/4065883015_4bb6010cb7_n.jpg,daisy\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/roses/7420699022_60fa574524_m.jpg,roses\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/dandelion/4558536575_d43a611bd4_n.jpg,dandelion\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/daisy/7568630428_8cf0fc16ff_n.jpg,daisy\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/tulips/7064813645_f7f48fb527.jpg,tulips\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/sunflowers/4933229095_f7e4218b28.jpg,sunflowers\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "create_a_dataset:migration"
   },
   "source": [
    "## Create a dataset\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bkdu67d_xXiT"
   },
   "source": [
    "### [projects.locations.datasets.create](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.datasets/create)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "request:migration"
   },
   "source": [
    "#### Request\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "uTrBPMR5xXiU",
    "outputId": "8da73a34-a13f-4e1f-c8af-7f25338db142"
   },
   "outputs": [],
   "source": [
    "dataset = {\n",
    "    \"display_name\": \"flowers_\" + TIMESTAMP,\n",
    "    \"image_classification_dataset_metadata\": {\n",
    "        \"classification_type\": \"MULTICLASS\",\n",
    "    },\n",
    "}\n",
    "\n",
    "print(MessageToJson(\n",
    "    automl.CreateDatasetRequest(\n",
    "        parent=PARENT,\n",
    "        dataset=dataset,\n",
    "    ).__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jvhVeS_ExXiU"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"parent\": \"projects/migration-ucaip-training/locations/us-central1\",\n",
    "  \"dataset\": {\n",
    "    \"displayName\": \"flowers_20210226015151\",\n",
    "    \"imageClassificationDatasetMetadata\": {\n",
    "      \"classificationType\": \"MULTICLASS\"\n",
    "    }\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "call:migration"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "datasets_create:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].create_dataset(\n",
    "    parent=PARENT,\n",
    "    dataset=dataset,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "response:migration"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "print:migration,new,response",
    "outputId": "addad607-2542-45c2-d1b1-5ca7aa1d5d0c"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "datasets_create:migration,new,response"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/datasets/ICN2833688305139187712\"\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "dataset_id:migration,new,response",
    "outputId": "d201ed62-717f-4798-9006-a299684d4bf5"
   },
   "outputs": [],
   "source": [
    "# The full unique ID for the dataset\n",
    "dataset_id = result.name\n",
    "# The short numeric ID for the dataset\n",
    "dataset_short_id = dataset_id.split('/')[-1]\n",
    "\n",
    "print(dataset_id)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "qHWi_CMnxXiV"
   },
   "source": [
    "### [projects.locations.datasets.importData](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.datasets/importData)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "py-0niVqxXiW"
   },
   "source": [
    "#### Request\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "datasets_import:migration,new,request",
    "outputId": "83bf0203-7782-42e8-ab78-a23eb1679561"
   },
   "outputs": [],
   "source": [
    "input_config = {\n",
    "    \"gcs_source\": {\n",
    "        \"input_uris\": [IMPORT_FILE],\n",
    "    },\n",
    "}\n",
    "\n",
    "print(MessageToJson(\n",
    "    automl.ImportDataRequest(\n",
    "        name=dataset_short_id,\n",
    "        input_config=input_config\n",
    "    ).__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cxbp1cGzxXiW"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"ICN2833688305139187712\",\n",
    "  \"inputConfig\": {\n",
    "    \"gcsSource\": {\n",
    "      \"inputUris\": [\n",
    "        \"gs://migration-ucaip-trainingaip-20210226015151/flower_photos/train_set.csv\"\n",
    "      ]\n",
    "    }\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "v8kGJFwYxXiW"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "datasets_import:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].import_data(\n",
    "    name=dataset_id,\n",
    "    input_config=input_config\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UxcyIvGLxXiW"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "zXlYWLR7xXiX",
    "outputId": "d5740c78-a8db-4d69-84d7-72cf3b83cf87"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "datasets_import:migration,new,response"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "train_a_model:migration"
   },
   "source": [
    "## Train a model\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "text_models_create:migration,old"
   },
   "source": [
    "### [projects.locations.models.create](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/create)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bytx9mM0xXiX"
   },
   "source": [
    "#### Request\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "trainingpipelines_create:migration,new,request,icn",
    "outputId": "4156101b-6aa6-48d3-d4de-277ab6c3757e"
   },
   "outputs": [],
   "source": [
    "model = {\n",
    "    \"display_name\": \"flowers_\" + TIMESTAMP,\n",
    "    \"dataset_id\": dataset_short_id,\n",
    "    \"image_classification_model_metadata\": {\n",
    "        \"train_budget_milli_node_hours\": 8000,\n",
    "    },\n",
    "}\n",
    "\n",
    "print(MessageToJson(\n",
    "    automl.CreateModelRequest(\n",
    "        parent=PARENT,\n",
    "        model=model,\n",
    "    ).__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wF6C0IJcxXiY"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"parent\": \"projects/migration-ucaip-training/locations/us-central1\",\n",
    "  \"model\": {\n",
    "    \"displayName\": \"flowers_20210226015151\",\n",
    "    \"datasetId\": \"ICN2833688305139187712\",\n",
    "    \"imageClassificationModelMetadata\": {\n",
    "      \"trainBudgetMilliNodeHours\": \"8000\"\n",
    "    }\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cNNI6bjcxXiY"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "trainingpipelines_create:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].create_model(\n",
    "    parent=PARENT,\n",
    "    model=model,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZBPeFwbQxXiY"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "print:migration,new,request",
    "outputId": "8f64b370-c390-4f6d-8f9f-d8204a49bcda"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "trainingpipelines_create:migration,new,response,icn"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168\"\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "training_pipeline_id:migration,new,response",
    "outputId": "484821ac-6ab3-4a26-c3af-b2008661606d"
   },
   "outputs": [],
   "source": [
    "# The full unique ID for the training pipeline\n",
    "model_id = result.name\n",
    "# The short numeric ID for the training pipeline\n",
    "model_short_id = model_id.split('/')[-1]\n",
    "\n",
    "print(model_short_id)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "evaluate_the_model:migration"
   },
   "source": [
    "## Evaluate the model\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yfufMwAEJjkX"
   },
   "source": [
    "### [projects.locations.models.modelEvaluations.list](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models.modelEvaluations/list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LA6VndrpxXiZ"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "models_evaluations_list:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].list_model_evaluations(\n",
    "    parent=model_id, \n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8CyKSW9wxXiZ"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "AxEY7WFHj2YC",
    "outputId": "e284ae12-dbb8-4b8f-c576-03d23cc822af"
   },
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "\n",
    "model_evaluations = [\n",
    "    json.loads(MessageToJson(me.__dict__[\"_pb\"])) for me in request \n",
    "]\n",
    "# The evaluation slice\n",
    "evaluation_slice = request.model_evaluation[0].name\n",
    "\n",
    "print(json.dumps(model_evaluations, indent=2))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "models_evaluations_list:migration,new,response,icn"
   },
   "source": [
    "*Example output*\n",
    "```\n",
    "[\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/1701367336556072668\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"evaluatedExampleCount\": 329,\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.99747145,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.2\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 0.99088144,\n",
    "          \"precision\": 0.92877495\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 0.98784196,\n",
    "          \"precision\": 0.9447674\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 0.9848024,\n",
    "          \"precision\": 0.9501466\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 0.9848024,\n",
    "          \"precision\": 0.96142435\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 0.98176295,\n",
    "          \"precision\": 0.9641791\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 0.98176295,\n",
    "          \"precision\": 0.9670659\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 0.9787234,\n",
    "          \"precision\": 0.966967\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 0.97568387,\n",
    "          \"precision\": 0.96686745\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 0.97568387,\n",
    "          \"precision\": 0.9727273\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 0.9726444,\n",
    "          \"precision\": 0.9756098\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 0.9726444,\n",
    "          \"precision\": 0.9756098\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 0.9665654,\n",
    "          \"precision\": 0.9754601\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 0.9665654,\n",
    "          \"precision\": 0.9814815\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 0.9665654,\n",
    "          \"precision\": 0.98452014\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 0.9665654,\n",
    "          \"precision\": 0.98452014\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.9604863,\n",
    "          \"precision\": 0.9875\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.9452888,\n",
    "          \"precision\": 0.99044585\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.94224924,\n",
    "          \"precision\": 0.99041533\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.9392097,\n",
    "          \"precision\": 0.99038464\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.9392097,\n",
    "          \"precision\": 0.99038464\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.9361702,\n",
    "          \"precision\": 0.9935484\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.9361702,\n",
    "          \"precision\": 0.9935484\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.9361702,\n",
    "          \"precision\": 0.9935484\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.9331307,\n",
    "          \"precision\": 0.99352753\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.9300912,\n",
    "          \"precision\": 0.99674267\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.92705166,\n",
    "          \"precision\": 0.996732\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.9148936,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.89361703,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.88145894,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.87234044,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.8693009,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.8449848,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.81155014,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.24012157,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"confusionMatrix\": {\n",
    "        \"annotationSpecId\": [\n",
    "          \"548545251585818624\",\n",
    "          \"4295540141558071296\",\n",
    "          \"5160231270013206528\",\n",
    "          \"6601383150771765248\",\n",
    "          \"8907226159985459200\"\n",
    "        ],\n",
    "        \"row\": [\n",
    "          {\n",
    "            \"exampleCount\": [\n",
    "              55,\n",
    "              0,\n",
    "              1,\n",
    "              2,\n",
    "              0\n",
    "            ]\n",
    "          },\n",
    "          {\n",
    "            \"exampleCount\": [\n",
    "              0,\n",
    "              59,\n",
    "              1,\n",
    "              0,\n",
    "              1\n",
    "            ]\n",
    "          },\n",
    "          {\n",
    "            \"exampleCount\": [\n",
    "              0,\n",
    "              0,\n",
    "              81,\n",
    "              0,\n",
    "              0\n",
    "            ]\n",
    "          },\n",
    "          {\n",
    "            \"exampleCount\": [\n",
    "              0,\n",
    "              0,\n",
    "              0,\n",
    "              73,\n",
    "              0\n",
    "            ]\n",
    "          },\n",
    "          {\n",
    "            \"exampleCount\": [\n",
    "              0,\n",
    "              1,\n",
    "              2,\n",
    "              0,\n",
    "              53\n",
    "            ]\n",
    "          }\n",
    "        ],\n",
    "        \"displayName\": [\n",
    "          \"roses\",\n",
    "          \"sunflowers\",\n",
    "          \"dandelion\",\n",
    "          \"tulips\",\n",
    "          \"daisy\"\n",
    "        ]\n",
    "      },\n",
    "      \"logLoss\": 0.02853713\n",
    "    }\n",
    "  },\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/4464795143994212237\",\n",
    "    \"annotationSpecId\": \"6601383150771765248\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.9990742,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.2218845\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.8795181\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9125\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9240506\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9605263\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9605263\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97333336\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97333336\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97333336\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97333336\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 0.98630136,\n",
    "          \"precision\": 0.972973\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 0.98630136,\n",
    "          \"precision\": 0.972973\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9726027\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9726027\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9726027\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9726027\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.9726027,\n",
    "          \"precision\": 0.9861111\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.9589041,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.9315069,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.91780823,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.91780823,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.91780823,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.9041096,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.8356164,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.12328767,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"auRoc\": 0.99973243,\n",
    "      \"logLoss\": 0.024023052\n",
    "    },\n",
    "    \"displayName\": \"tulips\"\n",
    "  },\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/6132683338167493052\",\n",
    "    \"annotationSpecId\": \"8907226159985459200\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.99841,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.17021276\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9655172\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 0.98214287,\n",
    "          \"precision\": 0.9649123\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 0.98214287,\n",
    "          \"precision\": 0.98214287\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 0.98214287,\n",
    "          \"precision\": 0.98214287\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 0.98214287,\n",
    "          \"precision\": 0.98214287\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 0.98214287,\n",
    "          \"precision\": 0.98214287\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 0.96428573,\n",
    "          \"precision\": 0.9818182\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 0.9464286,\n",
    "          \"precision\": 0.9814815\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 0.9464286,\n",
    "          \"precision\": 0.9814815\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 0.9464286,\n",
    "          \"precision\": 0.9814815\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 0.9464286,\n",
    "          \"precision\": 0.9814815\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 0.9811321\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 0.9811321\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 0.9811321\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 0.9811321\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 0.9811321\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.9285714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.91071427,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.91071427,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.91071427,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.91071427,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.875,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.83928573,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.8214286,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.8035714,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.78571427,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.76785713,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.30357143,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"auRoc\": 0.99967295,\n",
    "      \"logLoss\": 0.022124559\n",
    "    },\n",
    "    \"displayName\": \"daisy\"\n",
    "  },\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/7147485663377408481\",\n",
    "    \"annotationSpecId\": \"548545251585818624\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.9971625,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.1762918\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 0.9655172,\n",
    "          \"precision\": 0.93333334\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 0.9655172,\n",
    "          \"precision\": 0.9655172\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 0.9655172,\n",
    "          \"precision\": 0.9655172\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 0.9655172,\n",
    "          \"precision\": 0.9655172\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 0.9649123\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 0.9649123\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 0.9649123\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 0.9649123\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 0.98214287\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.94827586,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.87931037,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.87931037,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.87931037,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.87931037,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.86206895,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.8448276,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.79310346,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.79310346,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.7758621,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.7758621,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.70689654,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.6896552,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.03448276,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"auRoc\": 0.9993638,\n",
    "      \"logLoss\": 0.034111425\n",
    "    },\n",
    "    \"displayName\": \"roses\"\n",
    "  },\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/8076647367053688867\",\n",
    "    \"annotationSpecId\": \"5160231270013206528\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.9989403,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.2462006\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9101124\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.92045456\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.92045456\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9310345\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.94186044\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.94186044\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.94186044\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.94186044\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9529412\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9529412\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9529412\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.9529412\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.96428573\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97590363\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.97590363\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.9876543,\n",
    "          \"precision\": 0.9756098\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.9876543,\n",
    "          \"precision\": 0.9756098\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.97530866,\n",
    "          \"precision\": 0.97530866\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.975\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.975\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.98734176\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.98734176\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.98734176\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.962963,\n",
    "          \"precision\": 0.98734176\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.9506173,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.9382716,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.9259259,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.5555556,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"auRoc\": 0.99965155,\n",
    "      \"logLoss\": 0.029262401\n",
    "    },\n",
    "    \"displayName\": \"dandelion\"\n",
    "  },\n",
    "  {\n",
    "    \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/8816571236383372686\",\n",
    "    \"annotationSpecId\": \"4295540141558071296\",\n",
    "    \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "    \"classificationEvaluationMetrics\": {\n",
    "      \"auPrc\": 0.99703646,\n",
    "      \"confidenceMetricsEntry\": [\n",
    "        {\n",
    "          \"recall\": 1.0,\n",
    "          \"precision\": 0.18541034\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.05,\n",
    "          \"recall\": 0.9836066,\n",
    "          \"precision\": 0.9836066\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.1,\n",
    "          \"recall\": 0.9836066,\n",
    "          \"precision\": 0.9836066\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.15,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.2,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.25,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.3,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.35,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.4,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.45,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.5,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.55,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.6,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 0.98333335\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.65,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.7,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.75,\n",
    "          \"recall\": 0.9672131,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.8,\n",
    "          \"recall\": 0.9508197,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.85,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.875,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.9,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.91,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.92,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.93,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.94,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.95,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.96,\n",
    "          \"recall\": 0.93442625,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.97,\n",
    "          \"recall\": 0.91803277,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.98,\n",
    "          \"recall\": 0.8852459,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.99,\n",
    "          \"recall\": 0.8852459,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.995,\n",
    "          \"recall\": 0.86885244,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.996,\n",
    "          \"recall\": 0.852459,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.997,\n",
    "          \"recall\": 0.852459,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.998,\n",
    "          \"recall\": 0.8360656,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 0.999,\n",
    "          \"recall\": 0.78688526,\n",
    "          \"precision\": 1.0\n",
    "        },\n",
    "        {\n",
    "          \"confidenceThreshold\": 1.0,\n",
    "          \"recall\": 0.09836066,\n",
    "          \"precision\": 1.0\n",
    "        }\n",
    "      ],\n",
    "      \"auRoc\": 0.9992048,\n",
    "      \"logLoss\": 0.03316421\n",
    "    },\n",
    "    \"displayName\": \"sunflowers\"\n",
    "  }\n",
    "]\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "i6T0bzuNJjkY"
   },
   "source": [
    "### [projects.locations.models.modelEvaluations.get](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models.modelEvaluations/get)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "KJ1zoYmrxXia"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "models_evaluations_get:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].get_model_evaluation(\n",
    "    name=evaluation_slice,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_uZksIkGxXia"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "cEqg6FHvxXib",
    "outputId": "135ca63e-f2ba-44d5-8a2a-df478d2335e3",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "print(MessageToJson(request.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "models_evaluations_get:migration,new,response,icn"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168/modelEvaluations/1701367336556072668\",\n",
    "  \"createTime\": \"2021-02-26T03:00:19.383521Z\",\n",
    "  \"evaluatedExampleCount\": 329,\n",
    "  \"classificationEvaluationMetrics\": {\n",
    "    \"auPrc\": 0.99747145,\n",
    "    \"confidenceMetricsEntry\": [\n",
    "      {\n",
    "        \"recall\": 1.0,\n",
    "        \"precision\": 0.2\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.05,\n",
    "        \"recall\": 0.99088144,\n",
    "        \"precision\": 0.92877495\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.1,\n",
    "        \"recall\": 0.98784196,\n",
    "        \"precision\": 0.9447674\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.15,\n",
    "        \"recall\": 0.9848024,\n",
    "        \"precision\": 0.9501466\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.2,\n",
    "        \"recall\": 0.9848024,\n",
    "        \"precision\": 0.96142435\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.25,\n",
    "        \"recall\": 0.98176295,\n",
    "        \"precision\": 0.9641791\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.3,\n",
    "        \"recall\": 0.98176295,\n",
    "        \"precision\": 0.9670659\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.35,\n",
    "        \"recall\": 0.9787234,\n",
    "        \"precision\": 0.966967\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.4,\n",
    "        \"recall\": 0.97568387,\n",
    "        \"precision\": 0.96686745\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.45,\n",
    "        \"recall\": 0.97568387,\n",
    "        \"precision\": 0.9727273\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.5,\n",
    "        \"recall\": 0.9726444,\n",
    "        \"precision\": 0.9756098\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.55,\n",
    "        \"recall\": 0.9726444,\n",
    "        \"precision\": 0.9756098\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.6,\n",
    "        \"recall\": 0.9665654,\n",
    "        \"precision\": 0.9754601\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.65,\n",
    "        \"recall\": 0.9665654,\n",
    "        \"precision\": 0.9814815\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.7,\n",
    "        \"recall\": 0.9665654,\n",
    "        \"precision\": 0.98452014\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.75,\n",
    "        \"recall\": 0.9665654,\n",
    "        \"precision\": 0.98452014\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.8,\n",
    "        \"recall\": 0.9604863,\n",
    "        \"precision\": 0.9875\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.85,\n",
    "        \"recall\": 0.9452888,\n",
    "        \"precision\": 0.99044585\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.875,\n",
    "        \"recall\": 0.94224924,\n",
    "        \"precision\": 0.99041533\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.9,\n",
    "        \"recall\": 0.9392097,\n",
    "        \"precision\": 0.99038464\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.91,\n",
    "        \"recall\": 0.9392097,\n",
    "        \"precision\": 0.99038464\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.92,\n",
    "        \"recall\": 0.9361702,\n",
    "        \"precision\": 0.9935484\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.93,\n",
    "        \"recall\": 0.9361702,\n",
    "        \"precision\": 0.9935484\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.94,\n",
    "        \"recall\": 0.9361702,\n",
    "        \"precision\": 0.9935484\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.95,\n",
    "        \"recall\": 0.9331307,\n",
    "        \"precision\": 0.99352753\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.96,\n",
    "        \"recall\": 0.9300912,\n",
    "        \"precision\": 0.99674267\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.97,\n",
    "        \"recall\": 0.92705166,\n",
    "        \"precision\": 0.996732\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.98,\n",
    "        \"recall\": 0.9148936,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.99,\n",
    "        \"recall\": 0.89361703,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.995,\n",
    "        \"recall\": 0.88145894,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.996,\n",
    "        \"recall\": 0.87234044,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.997,\n",
    "        \"recall\": 0.8693009,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.998,\n",
    "        \"recall\": 0.8449848,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 0.999,\n",
    "        \"recall\": 0.81155014,\n",
    "        \"precision\": 1.0\n",
    "      },\n",
    "      {\n",
    "        \"confidenceThreshold\": 1.0,\n",
    "        \"recall\": 0.24012157,\n",
    "        \"precision\": 1.0\n",
    "      }\n",
    "    ],\n",
    "    \"confusionMatrix\": {\n",
    "      \"annotationSpecId\": [\n",
    "        \"548545251585818624\",\n",
    "        \"4295540141558071296\",\n",
    "        \"5160231270013206528\",\n",
    "        \"6601383150771765248\",\n",
    "        \"8907226159985459200\"\n",
    "      ],\n",
    "      \"row\": [\n",
    "        {\n",
    "          \"exampleCount\": [\n",
    "            55,\n",
    "            0,\n",
    "            1,\n",
    "            2,\n",
    "            0\n",
    "          ]\n",
    "        },\n",
    "        {\n",
    "          \"exampleCount\": [\n",
    "            0,\n",
    "            59,\n",
    "            1,\n",
    "            0,\n",
    "            1\n",
    "          ]\n",
    "        },\n",
    "        {\n",
    "          \"exampleCount\": [\n",
    "            0,\n",
    "            0,\n",
    "            81,\n",
    "            0,\n",
    "            0\n",
    "          ]\n",
    "        },\n",
    "        {\n",
    "          \"exampleCount\": [\n",
    "            0,\n",
    "            0,\n",
    "            0,\n",
    "            73,\n",
    "            0\n",
    "          ]\n",
    "        },\n",
    "        {\n",
    "          \"exampleCount\": [\n",
    "            0,\n",
    "            1,\n",
    "            2,\n",
    "            0,\n",
    "            53\n",
    "          ]\n",
    "        }\n",
    "      ],\n",
    "      \"displayName\": [\n",
    "        \"roses\",\n",
    "        \"sunflowers\",\n",
    "        \"dandelion\",\n",
    "        \"tulips\",\n",
    "        \"daisy\"\n",
    "      ]\n",
    "    },\n",
    "    \"logLoss\": 0.02853713\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "make_batch_predictions:migration"
   },
   "source": [
    "## Make batch predictions\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "make_batch_prediction_file:migration,new"
   },
   "source": [
    "### Make a batch prediction file\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "get_test_items:automl,icn,csv",
    "outputId": "ccbb9682-59dd-464e-96a4-af102b28113e"
   },
   "outputs": [],
   "source": [
    "test_items = !gsutil cat $IMPORT_FILE | head -n2\n",
    "\n",
    "if len(str(test_items[0]).split(',')) == 3:\n",
    "    _, test_item_1, test_label_1 = str(test_items[0]).split(',')\n",
    "    _, test_item_2, test_label_2 = str(test_items[1]).split(',')\n",
    "else:\n",
    "    test_item_1, test_label_1 = str(test_items[0]).split(',')\n",
    "    test_item_2, test_label_2 = str(test_items[1]).split(',')\n",
    "\n",
    "print(test_item_1, test_label_1)\n",
    "print(test_item_2, test_label_2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fPuu9othxXib"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/daisy/754296579_30a9ae018c_n.jpg daisy\n",
    "gs://migration-ucaip-trainingaip-20210226015151/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg dandelion\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "copy_test_items:automl,image,batch_prediction",
    "outputId": "6d4ff7d7-5213-4e78-82e4-c559f55af6ec"
   },
   "outputs": [],
   "source": [
    "file_1 = test_item_1.split('/')[-1]\n",
    "file_2 = test_item_2.split('/')[-1]\n",
    "\n",
    "! gsutil cp $test_item_1 gs://$BUCKET_NAME/$file_1\n",
    "! gsutil cp $test_item_2 gs://$BUCKET_NAME/$file_2\n",
    "\n",
    "test_item_1 = \"gs://\" + BUCKET_NAME + \"/\" + file_1\n",
    "test_item_2 = \"gs://\" + BUCKET_NAME + \"/\" + file_2\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "make_batch_file:automl,image"
   },
   "source": [
    "### Make the batch input file\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SY29TGSVxXic",
    "outputId": "15e99cb6-cf3e-4133-d5cf-815a0c6b39f4"
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import json\n",
    "\n",
    "\n",
    "gcs_input_uri = \"gs://\" + BUCKET_NAME + '/test.csv'\n",
    "with tf.io.gfile.GFile(gcs_input_uri, 'w') as f:\n",
    "    f.write(test_item_1 + '\\n')\n",
    "    f.write(test_item_2 + '\\n')\n",
    "\n",
    "!gsutil cat $gcs_input_uri\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Bc2Hnu9-xXic"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "gs://migration-ucaip-trainingaip-20210226015151/754296579_30a9ae018c_n.jpg\n",
    "gs://migration-ucaip-trainingaip-20210226015151/18089878729_907ed2c7cd_m.jpg\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "text_models_batchpredict:migration,old"
   },
   "source": [
    "### [projects.locations.models.batchPredict](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/batchPredict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6udI5yImxXid"
   },
   "source": [
    "#### Request\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "batchpredictionjobs_create:migration,new,request,icn",
    "outputId": "1c80667a-65a1-4b53-b2ef-3a1d3213453d"
   },
   "outputs": [],
   "source": [
    "input_config = {\n",
    "    \"gcs_source\": {\n",
    "        \"input_uris\": [gcs_input_uri]\n",
    "    },\n",
    "}\n",
    "\n",
    "output_config = {\n",
    "    \"gcs_destination\": {\n",
    "        \"output_uri_prefix\": \"gs://\" + f\"{BUCKET_NAME}/batch_output/\"\n",
    "    }\n",
    "}\n",
    "\n",
    "batch_prediction = automl.BatchPredictRequest(\n",
    "    name=model_id,\n",
    "    input_config=input_config,\n",
    "    output_config=output_config\n",
    ")\n",
    "\n",
    "print(MessageToJson(\n",
    "    batch_prediction.__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "u10t0ejsxXid"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168\",\n",
    "  \"inputConfig\": {\n",
    "    \"gcsSource\": {\n",
    "      \"inputUris\": [\n",
    "        \"gs://migration-ucaip-trainingaip-20210226015151/test.csv\"\n",
    "      ]\n",
    "    }\n",
    "  },\n",
    "  \"outputConfig\": {\n",
    "    \"gcsDestination\": {\n",
    "      \"outputUriPrefix\": \"gs://migration-ucaip-trainingaip-20210226015151/batch_output/\"\n",
    "    }\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hax200orxXid"
   },
   "source": [
    "#### Call\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "batchpredictionjobs_create:migration,new,call"
   },
   "outputs": [],
   "source": [
    "request = clients[\"prediction\"].batch_predict(\n",
    "    request=batch_prediction\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DzaQAgVCxXid"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "GwBukgk1xXie",
    "outputId": "4b0fabcb-9025-4824-9f74-cff6b0a1d856"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "batchpredictionjobs_create:migration,new,response,icn"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "fnYRCde3xXie",
    "outputId": "7800b730-ccfb-42f6-b8a9-6a3531e830c7"
   },
   "outputs": [],
   "source": [
    "destination_uri = batch_prediction.output_config.gcs_destination.output_uri_prefix[:-1]\n",
    "\n",
    "! gsutil ls $destination_uri/*\n",
    "! gsutil cat $destination_uri/prediction*/*.jsonl\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gbjPT-mLxXie"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "gs://migration-ucaip-trainingaip-20210226015151/batch_output/prediction-flowers_20210226015151-2021-02-26T03:00:47.533913Z/image_classification_0.jsonl\n",
    "gs://migration-ucaip-trainingaip-20210226015151/batch_output/prediction-flowers_20210226015151-2021-02-26T03:00:47.533913Z/image_classification_1.jsonl\n",
    "{\"ID\":\"gs://migration-ucaip-trainingaip-20210226015151/18089878729_907ed2c7cd_m.jpg\",\"annotations\":[{\"annotation_spec_id\":\"5160231270013206528\",\"classification\":{\"score\":0.9993481},\"display_name\":\"dandelion\"}]}\n",
    "{\"ID\":\"gs://migration-ucaip-trainingaip-20210226015151/754296579_30a9ae018c_n.jpg\",\"annotations\":[{\"annotation_spec_id\":\"8907226159985459200\",\"classification\":{\"score\":1},\"display_name\":\"daisy\"}]}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lA-sKaK8xXie"
   },
   "source": [
    "## Make online predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5j4eOtdHxXif"
   },
   "source": [
    "### Prepare file for online prediction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "text_models_deploy:migration,old"
   },
   "source": [
    "### [projects.locations.models.deploy](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/deploy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Vo3Dq7IQxXif"
   },
   "source": [
    "#### Call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "QVIojpOdxXif"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].deploy_model(\n",
    "    name=model_id\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VrWzqRt6xXif"
   },
   "source": [
    "#### Response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "86D1mJOoxXif",
    "outputId": "cba0d7f8-e84f-432c-810c-00d2ce680c3a"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bB3px5SBxXig"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "text_models_predict:migration,old"
   },
   "source": [
    "### [projects.locations.models.predict](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LRgEK5aaxXig"
   },
   "source": [
    "#### Request"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "UOwIprmDxXig",
    "outputId": "c90776f2-2084-44e7-af61-9531cd8c58d4",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "test_item = !gsutil cat $IMPORT_FILE | head -n1\n",
    "test_item = test_item[0].split(\",\")[0]\n",
    "\n",
    "with tf.io.gfile.GFile(test_item, \"rb\") as f:\n",
    "    content = f.read()\n",
    "\n",
    "payload = [{\n",
    "    \"image\": {\n",
    "        \"image_bytes\": content\n",
    "    }\n",
    "}]\n",
    "\n",
    "params = {\"score_threshold\": \"0.8\"}\n",
    "\n",
    "prediction_r = automl.PredictRequest(\n",
    "    name=model_id,\n",
    "    payload=payload,\n",
    "    params=params\n",
    ")\n",
    "\n",
    "print(MessageToJson(\n",
    "    automl.PredictRequest(\n",
    "        name=model_id,\n",
    "        payload=payload,\n",
    "        params=params\n",
    "    ).__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_3xVOX8sxXih"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN3600040762873479168\",\n",
    "  \"payload\": {\n",
    "    \"image\": {\n",
    "      \"imageBytes\": \"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\"\n",
    "    }\n",
    "  },\n",
    "  \"params\": {\n",
    "    \"score_threshold\": \"0.8\"\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TIqWQ1uzxXih"
   },
   "source": [
    "#### Call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "k6DeqQWixXih"
   },
   "outputs": [],
   "source": [
    "request = clients[\"prediction\"].predict(\n",
    "    name=model_id,\n",
    "    payload=payload,\n",
    "    params=params\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "sIls-rRaxXih"
   },
   "source": [
    "#### Response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1gfU3dZ6xXii",
    "outputId": "fd3d5e94-e085-44f2-b196-1a438478dacc"
   },
   "outputs": [],
   "source": [
    "print(MessageToJson(request.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2uqi9HpyxXii"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"payload\": [\n",
    "    {\n",
    "      \"annotationSpecId\": \"8907226159985459200\",\n",
    "      \"classification\": {\n",
    "        \"score\": 1.0\n",
    "      },\n",
    "      \"displayName\": \"daisy\"\n",
    "    }\n",
    "  ]\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "j14fFDBnxXii"
   },
   "source": [
    "### [projects.locations.models.undeploy](https://cloud.google.com/automl/docs/reference/rest/v1/projects.locations.models/undeploy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wrhN_FT4xXii"
   },
   "source": [
    "#### Request"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "kR-o0CO7xXii"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].undeploy_model(\n",
    "    name=model_id\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JF1qgjOfxXij"
   },
   "source": [
    "#### Call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "-VbCkwYyxXij"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SpuhCYjSxXij"
   },
   "source": [
    "#### Response\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ot9hRqTVxXij",
    "outputId": "1d17e1c1-2be9-4f4f-a25b-404ee7465f15"
   },
   "outputs": [],
   "source": [
    "print(MessageToJson(result))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4tj-vFT9xXij"
   },
   "source": [
    "*Example output*:\n",
    "\n",
    "```\n",
    "{}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "orEjC6NLxXij"
   },
   "source": [
    "## Train and export an Edge model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "CLL_rGa4xXik"
   },
   "source": [
    "### [projects.locations.models.create](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/create)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "mQBsYjcVxXik"
   },
   "source": [
    "#### Request"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "twgvR-l2xXil",
    "outputId": "82a0c11b-b3e0-45d8-b41d-c52e4975c68b"
   },
   "outputs": [],
   "source": [
    "# creating edge model for export\n",
    "model_edge = {\n",
    "    \"display_name\": \"flowers_edge_\" + TIMESTAMP,\n",
    "    \"dataset_id\": dataset_short_id,\n",
    "    \"image_classification_model_metadata\":{\n",
    "        \"train_budget_milli_node_hours\": 8000,\n",
    "        \"model_type\": \"mobile-versatile-1\"\n",
    "    },\n",
    "}\n",
    "\n",
    "print(\n",
    "    MessageToJson(\n",
    "        automl.CreateModelRequest(\n",
    "            parent=PARENT,\n",
    "            model=model_edge    \n",
    "        ).__dict__[\"_pb\"]\n",
    "    )\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "RRO7tHfhxXim"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"parent\": \"projects/migration-ucaip-training/locations/us-central1\",\n",
    "  \"model\": {\n",
    "    \"displayName\": \"flowers_edge_20210226015151\",\n",
    "    \"datasetId\": \"ICN2833688305139187712\",\n",
    "    \"imageClassificationModelMetadata\": {\n",
    "      \"modelType\": \"mobile-versatile-1\",\n",
    "      \"trainBudgetMilliNodeHours\": \"8000\"\n",
    "    }\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WpgXZxIbxXim"
   },
   "source": [
    "#### Call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "__Fnz5YPxXim"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].create_model(\n",
    "    parent=PARENT,\n",
    "    model=model_edge\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "N85ltvTexXim"
   },
   "source": [
    "#### Response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "808TqLvNxXim",
    "outputId": "bbad5246-0b95-4f58-f39e-4483ecb0e6dc"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result.__dict__[\"_pb\"]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tlldfZhCxXin"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN8566948201909714944\"\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "MfLa8cMoxXin"
   },
   "outputs": [],
   "source": [
    "model_edge_id = result.name\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EK06N_YWxXin"
   },
   "source": [
    "### [projects.locations.models.export](https://cloud.google.com/automl/docs/reference/rest/v1beta1/projects.locations.models/export)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "AS54kVvbxXin",
    "outputId": "f067c031-8ef1-4938-cc40-0e3c7ff8f65c"
   },
   "outputs": [],
   "source": [
    "output_config = {\n",
    "    \"model_format\": \"tflite\",\n",
    "    \"gcs_destination\": {\n",
    "        \"output_uri_prefix\": \"gs://\" + f\"{BUCKET_NAME}/export/\",\n",
    "    }\n",
    "}\n",
    "\n",
    "\n",
    "print(MessageToJson(\n",
    "    automl.ExportModelRequest(\n",
    "        name=model_edge_id,\n",
    "        output_config=output_config\n",
    "    ).__dict__[\"_pb\"])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fOH9ne7ixXin"
   },
   "source": [
    "*Example output*:\n",
    "\n",
    "```\n",
    "{\n",
    "  \"name\": \"projects/116273516712/locations/us-central1/models/ICN8566948201909714944\",\n",
    "  \"outputConfig\": {\n",
    "    \"gcsDestination\": {\n",
    "      \"outputUriPrefix\": \"gs://migration-ucaip-trainingaip-20210226015151/export/\"\n",
    "    },\n",
    "    \"modelFormat\": \"tflite\"\n",
    "  }\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FyK175Y1xXin"
   },
   "source": [
    "#### Call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Tb-0zJeGxXin"
   },
   "outputs": [],
   "source": [
    "request = clients[\"automl\"].export_model(\n",
    "    name=model_edge_id,\n",
    "    output_config=output_config\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "c7o6520bxXio"
   },
   "source": [
    "#### Response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Y8RN4-SvxXio",
    "outputId": "31c811f0-7f4f-4735-e4ed-5e959e99f843"
   },
   "outputs": [],
   "source": [
    "result = request.result()\n",
    "\n",
    "print(MessageToJson(result))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bml24eNjxXio"
   },
   "source": [
    "*Example output*:\n",
    "\n",
    "```\n",
    "{}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "mbbVNOBRxXio",
    "outputId": "98259422-edef-4807-8656-55b147440087"
   },
   "outputs": [],
   "source": [
    "model_export_dir  = output_config[\"gcs_destination\"][\"output_uri_prefix\"]\n",
    "\n",
    "! gsutil ls -r $model_export_dir\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cBYOnQUDxXio"
   },
   "source": [
    "*Example output*:\n",
    "```\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/:\n",
    "\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/:\n",
    "\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/icn/:\n",
    "\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/icn/tflite-flowers_edge_20210226015151-2021-02-26T06:16:19.437101Z/:\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/icn/tflite-flowers_edge_20210226015151-2021-02-26T06:16:19.437101Z/dict.txt\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/icn/tflite-flowers_edge_20210226015151-2021-02-26T06:16:19.437101Z/model.tflite\n",
    "gs://migration-ucaip-trainingaip-20210226015151/export/model-export/icn/tflite-flowers_edge_20210226015151-2021-02-26T06:16:19.437101Z/tflite_metadata.json\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cleanup:migration,new"
   },
   "source": [
    "# Cleaning up\n",
    "\n",
    "To clean up all GCP resources used in this project, you can [delete the GCP\n",
    "project](https://cloud.google.com/resource-manager/docs/creating-managing-projects#shutting_down_projects) you used for the tutorial.\n",
    "\n",
    "Otherwise, you can delete the individual resources you created in this tutorial.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IRwi0SHBxXio",
    "outputId": "7309e56d-ea43-4d70-da6d-c00de8fe6f5c",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "delete_dataset = True\n",
    "delete_model = True\n",
    "delete_bucket = True\n",
    "\n",
    "# Delete the dataset using the AutoML fully qualified identifier for the dataset\n",
    "try:\n",
    "    if delete_dataset:\n",
    "        clients['automl'].delete_dataset(name=dataset_id)\n",
    "except Exception as e:\n",
    "    print(e)\n",
    "\n",
    "# Delete the model using the AutoML fully qualified identifier for the model\n",
    "try:\n",
    "    if delete_model:\n",
    "        clients['automl'].delete_model(name=model_id)\n",
    "except Exception as e:\n",
    "    print(e)\n",
    "    \n",
    "# Delete the model using the AutoML fully qualified identifier for the model\n",
    "try:\n",
    "    if delete_model:\n",
    "        clients['automl'].delete_model(name=model_edge_id)\n",
    "except Exception as e:\n",
    "    print(e) \n",
    "\n",
    "if delete_bucket and 'BUCKET_NAME' in globals():\n",
    "    ! gsutil rm -r gs://$BUCKET_NAME\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "BZDoIRo0UEhJ"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [
    "gcp_authenticate",
    "bucket:batch_prediction",
    "setup_vars",
    "import_aip",
    "aip_constants",
    "5j4eOtdHxXif"
   ],
   "name": "[UJ.1 OLD] AutoML Vision Image Classification.ipynb",
   "provenance": []
  },
  "environment": {
   "name": "tf2-2-3-gpu.2-3.m55",
   "type": "gcloud",
   "uri": "gcr.io/deeplearning-platform-release/tf2-2-3-gpu.2-3:m55"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
